#include<queue> #include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; void Rd(int&res){ res=0;char c; while(c=getchar(),c<48); do res=res*10+(c&15); while(c=getchar(),c>47); } const int N=5005,Q=1000005; int head[N],tot_edge; struct Edge{ int to,nxt; }edge[N<<1]; void add_edge(int a,int b){ edge[tot_edge]=(Edge){b,head[a]}; head[a]=tot_edge++; } int n,m,k,sum[N]; struct Query{ int s,t,d,id; bool operator <(const Query&tmp)const{ return s<tmp.s; } }q[Q]; bool ans[Q]; int dis[2][N]; struct node{ bool tag;int p; }; queue<node>que; void BFS(int s){ while(!que.empty())que.pop(); memset(dis,-1,sizeof(dis)); dis[0][s]=0,que.push((node){0,s}); while(!que.empty()){ node cur=que.front();que.pop(); int p=cur.p;bool tag=cur.tag; for(int i=head[p];~i;i=edge[i].nxt){ int to=edge[i].to; if(dis[tag^1][to]==-1) dis[tag^1][to]=dis[tag][p]+1,que.push((node){tag^1,to}); } } } int main(){ memset(head,-1,sizeof(head)); Rd(n),Rd(m),Rd(k); for(int i=1,a,b;i<=m;i++){ Rd(a),Rd(b); add_edge(a,b); add_edge(b,a); sum[a]++,sum[b]++; } for(int i=1;i<=k;i++){ Rd(q[i].s),Rd(q[i].t),Rd(q[i].d),q[i].id=i; } sort(q+1,q+1+k); int cnt=0,ns; while(cnt<k){ ns=q[cnt+1].s; BFS(ns); while(cnt<k&&q[cnt+1].s==ns){ int id=q[cnt+1].id,t=q[cnt+1].t,d=q[cnt+1].d; bool tag=d%2; if(~dis[tag][t]&&(dis[tag][t]==d||dis[tag][t]<d&&sum[t]))ans[id]=true; else ans[id]=false; cnt++; } } for(int i=1;i<=k;i++){ if(ans[i])printf("TAK\n"); else printf("NIE\n"); } return 0; }
|